From: Keir Fraser Date: Fri, 4 Sep 2009 07:42:10 +0000 (+0100) Subject: xend: Support "bootloader" mode for "drbd:" devices X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13383 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=e4e14402c14addda748464495db705f2ce08bb80;p=xen.git xend: Support "bootloader" mode for "drbd:" devices To be able to use "bootloader" on drbd devices the following changes need to be made: *) Translation of devicename _parse_uname which is used by blkdev_uname_to_file which is again used by _configureBootloader in XendDomainInfo needs to be able to resolve drbd resources to the corresponding blockdevice to feed to the configured bootloader. *) Activation of drbd device If the drbd device isn't in Primary mode when the bootloader tries to fetch the kernel and initrd, the start of the DomU will fail. To prevent this the given drbd device will be made Primary before the bootloader gets executed. A note on the naming of drbd resouces: drbd uses mostly resource names in it's userland tools. Because of that drbd VBDs, if configured with the "drbd:" type, should always use the drbd resource name as suggested by the drbd documentation at http://www.drbd.org/users-guide-emb/s-xen-configure-domu.html. My patches assume that the VBDs are named accordingly. Signed-off-by: Michael Renner --- diff --git a/tools/python/xen/util/blkif.py b/tools/python/xen/util/blkif.py index 6091afe5ac..c73a946a25 100644 --- a/tools/python/xen/util/blkif.py +++ b/tools/python/xen/util/blkif.py @@ -75,8 +75,17 @@ def _parse_uname(uname): fn = taptype = None if uname.find(":") != -1: (typ, fn) = uname.split(":", 1) - if typ in ("phy", "drbd") and not fn.startswith("/"): + + if typ == "phy" and not fn.startswith("/"): fn = "/dev/%s" %(fn,) + + if typ == "drbd": + if not fn.startswith("drbd"): + (drbdadmstdin, drbdadmstdout) = os.popen2(["/sbin/drbdadm", "sh-dev", fn]) + fn = drbdadmstdout.readline().strip() + else: + fn = "/dev/%s" %(fn,) + if typ == "tap": (taptype, fn) = fn.split(":", 1) return (fn, taptype) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 32496041d1..53bdf4eaa6 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -2994,6 +2994,16 @@ class XendDomainInfo: disk = devinfo[1]['uname'] fn = blkdev_uname_to_file(disk) + + # If this is a drbd volume, check if we need to activate it + if disktype.find(":") != -1: + (disktype, diskname) = disk.split(':', 1) + if disktype == 'drbd': + (drbdadmstdin, drbdadmstdout) = os.popen2(["/sbin/drbdadm", "state", diskname]) + (state, junk) = drbdadmstdout.readline().split('/', 1) + if state == 'Secondary': + os.system('/sbin/drbdadm primary ' + diskname) + taptype = blkdev_uname_to_taptype(disk) mounted = devtype in ['tap', 'tap2'] and taptype != 'aio' and taptype != 'sync' and not os.stat(fn).st_rdev if mounted: